home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
MACD 5
/
MACD 5.bin
/
workbench
/
tools
/
czesc_2
/
menulock
/
menulock.c
< prev
next >
Wrap
C/C++ Source or Header
|
1991-11-21
|
12KB
|
440 lines
/*-- AutoRev header do NOT edit!
*
* Program : MenuLock.c
* Copyright : © Copyright 1991 Jaba Development
* Author : Jan van den Baard
* Creation Date : 11-Sep-91
* Current version : 1.01
* Translator : DICE v2.6
*
* REVISION HISTORY
*
* Date Version Comment
* --------- ------- ------------------------------------------
* 20-Sep-91 1.01 Now uses the Dos ReadArgs for the Shell.
* 11-Sep-91 1.00 MenuStrip lock utility.
* 11-Sep-91 1.00 Based on code by Stefan Sticht. (thanks!)
*
*-- REV_END --*/
/*
* --- Include a whole buch of headers...
*/
#include <exec/types.h>
#include <exec/memory.h>
#include <dos/dos.h>
#include <libraries/commodities.h>
#include <workbench/startup.h>
#ifndef abs
#define abs
#endif
#include <stdlib.h>
#include <string.h>
#include <clib/alib_protos.h>
#include <clib/exec_protos.h>
#include <clib/dos_protos.h>
#include <clib/commodities_protos.h>
#include <clib/utility_protos.h>
/*
* --- Macro's to (de)activate the commodity
*/
#define CxOn(b) ActivateCxObj(b,TRUE);
#define CxOff(b) ActivateCxObj(b,FALSE);
/*
* --- Calculate a bit-mask from a signal bit.
*/
#define BitMask(b) ( 1L << ((ULONG)b) )
#ifndef NOT
#define NOT !
#endif
/*
* --- Parameters and defaults.
*/
UBYTE *COM_PRIORITY = "PRIORITY"; /* PRIORITY=<pri> */
UBYTE *COM_LOCK = "LOCK"; /* LOCK=<hotkey> */
UBYTE *COM_UNLOCK = "UNLOCK"; /* UNLOCK=<hotkey> */
UBYTE *COM_QUIT = "QUIT"; /* QUIT=<hotkey> */
WORD COM_DEF_PRI = 0; /* default priority */
UBYTE *COM_DEF_LCK = "rcommand down"; /* default lock keys */
UBYTE *COM_DEF_ULC = "rcommand up"; /* default unlock keys*/
UBYTE *COM_DEF_QUI = "lshift control q"; /* default quit */
#define ML_QUIT 1L /* event ID */
/*
* --- Commodity information
*/
#define ML_VERSION "v1.01"
#define ML_NAME "MenuLock"
#define ML_DESCR "Locks the menu-strip."
#define ML_COPY "© 1991 Jaba Development"
#define ML_TITLE ML_NAME " " ML_VERSION ", " ML_COPY
/*
* --- Minimum library version required
*/
#define MIN_LIB 36L
/*
* --- Non autoinit libraries required
*/
struct CxBase *CxBase = NULL;
struct IconBase *IconBase = NULL;
extern struct WBStartup *_WBMsg;
struct MsgPort *ML_port = NULL; /* Commodity MsgPort */
char **ML_tool = NULL; /* ToolType array */
struct RDArgs *ML_args = NULL; /* Shell args */
struct RDArgs ML_iargs = { 0,0,0,0,0,0,0,RDAF_NOPROMPT };
ULONG ML_arg[4];
UBYTE *ML_temp = "PRIORITY/n,LOCK/k,UNLOCK/k,QUIT/k";
struct InputEvent *ML_event; /* RawMouse event */
struct InputEvent *ML_uevent; /* RawMouse event */
CxObj *ML_brok = NULL; /* The broker */
/*
* --- The broker data
*/
struct NewBroker ML_nbrok = {
NB_VERSION,ML_NAME,ML_TITLE,ML_DESCR,
NBU_NOTIFY|NBU_UNIQUE,0,NULL,0
};
ULONG ML_smask = NULL; /* MsgPort signal mask */
UBYTE *ML_lstr; /* lock HotKey string */
UBYTE *ML_ustr; /* unlock HotKey string*/
UBYTE *ML_qstr; /* quit HotKey string */
/*
* --- Identification string for the Version CLI-command
*/
UBYTE *ML_ver = "\0$VER: MenuLock © 1991 Jaba Development -- v1.01";
/*
* --- Program function proto-types
*/
CxObj *HotTranslate( UBYTE *, struct InputEvent * );
void CloseML( long );
void OpenML( void );
void CheckML( void );
/*
* --- This might be usefull in your commodities.
* ---
* --- This routine set's up a filter using CxFilter and then
* --- it set's up a translator using CxTranslate. This setup
* --- allows to directly translate a certan input event into
* --- another. It's something like "HotKey()" without a Sender
* --- object and a programmable Translate object.
* ---
* --- object = HotTranslate( description, ievent )
* ---
* --- CxObj *object;
* --- UBYTE *description;
* --- struct InputEvent *ievent;
*/
CxObj *HotTranslate( UBYTE *desc, struct InputEvent *ie )
{
CxObj *filt, *trans;
if ( NOT( filt = CxFilter( desc )))
return( NULL );
if ( NOT( trans = CxTranslate( ie ))) {
DeleteCxObj( filt );
return( NULL );
}
AttachCxObj( filt, trans );
return( filt );
}
/*
* --- Open up and allocate the resources required
*/
void OpenML( void )
{
CxObj *lock, *unlock, *quit;
WORD pri;
/*
* --- Open up non autoinit libraries
*/
if ( NOT( IconBase = (struct IconBase *)OpenLibrary( "icon.library", MIN_LIB )))
CloseML( 20L );
if ( NOT( CxBase = (struct CxBase *)OpenLibrary( "commodities.library", MIN_LIB )))
CloseML( 20L );
if ( _WBMsg ) {
/*
* --- Initialize the ToolTypes array
*/
ML_tool = (char **)ArgArrayInit( 0L, (char **)_WBMsg );
/*
* Get new or default priority.
*/
pri = ArgInt( ML_tool, COM_PRIORITY, COM_DEF_PRI );
/*
* --- Get new or default HotKey strings
*/
ML_lstr = ArgString( ML_tool, COM_LOCK, COM_DEF_LCK );
ML_ustr = ArgString( ML_tool, COM_UNLOCK, COM_DEF_ULC );
ML_qstr = ArgString( ML_tool, COM_QUIT, COM_DEF_QUI );
} else {
if ( ML_arg[0] ) pri = (WORD)ML_arg[0];
else pri = COM_DEF_PRI;
if ( ML_arg[1] ) ML_lstr = (UBYTE *)ML_arg[1];
else ML_lstr = COM_DEF_LCK;
if ( ML_arg[2] ) ML_ustr = (UBYTE *)ML_arg[2];
else ML_ustr = COM_DEF_ULC;
if ( ML_arg[3] ) ML_qstr = (UBYTE *)ML_arg[3];
else ML_qstr = COM_DEF_QUI;
}
/*
* --- Get a rawmouse input event
*/
if ( NOT( ML_event = InvertString( "<rawmouse rbutton>", NULL )))
CloseML( 25L );
if ( NOT( ML_uevent = InvertString( "<rawmouse rbutton>", NULL )))
CloseML( 25L );
ML_event->ie_Code = IECODE_RBUTTON;
ML_uevent->ie_Code = IECODE_RBUTTON | IECODE_UP_PREFIX;
/*
* --- commodities.library V36.180 it's InvertString seem's to contain
* --- a bug which inverts the class "rawmouse" as "event".
*/
ML_event->ie_Class = ML_uevent->ie_Class = IECLASS_RAWMOUSE;
/*
* --- Set broker priority
*/
ML_nbrok.nb_Pri = pri;
/*
* --- Create a MsgPort
*/
if ( NOT( ML_port = CreateMsgPort()))
CloseML( 21L );
/*
* --- Get the port signalmask and set the port in the broker
*/
ML_smask = BitMask(ML_port->mp_SigBit );
ML_nbrok.nb_Port = ML_port;
/*
* --- Setup the broker
*/
if ( NOT( ML_brok = CxBroker( &ML_nbrok, NULL )))
CloseML( 22L );
/*
* --- Setup the HotKey filters and attach them to the broker
*/
if ( NOT( lock = HotTranslate( ML_lstr, ML_event )))
CloseML( 26L );
AttachCxObj( ML_brok, lock );
if ( NOT( unlock = HotTranslate( ML_ustr, ML_uevent )))
CloseML( 26L );
AttachCxObj( ML_brok, unlock );
/*
* --- Set up the quit HotKey filter
*/
if (NOT ( quit = HotKey( ML_qstr, ML_port, ML_QUIT )))
CloseML( 23L );
AttachCxObj( ML_brok, quit );
/*
* --- Check for occured errors
*/
if ( CxObjError( lock ) || CxObjError( unlock ) || CxObjError( quit ))
CloseML( 24L );
/*
* --- If Workbench clear ArgArray
*/
if ( _WBMsg )
ArgArrayDone();
/*
* --- Activate the broker
*/
CxOn( ML_brok );
}
/*
* --- Close up and de-allocate the used resources
*/
void CloseML( long code )
{
struct Message *tmp; /* to clear the MsgPort */
/*
* --- Delete the broker
*/
if ( ML_brok ) DeleteCxObjAll( ML_brok );
/*
* --- Clear and delete the MsgPort
*/
if ( ML_port ) {
while (( tmp = GetMsg( ML_port ))) ReplyMsg( tmp );
DeleteMsgPort( ML_port );
}
/*
* --- Free the rawmouse input events
*/
if ( ML_event )
FreeIEvents( ML_event );
if ( ML_uevent )
FreeIEvents( ML_uevent );
/*
* --- Free the Shell arguments
*/
if ( ML_args )
FreeArgs( ML_args );
/*
* --- Close the non autoinit libraries
*/
if ( CxBase ) CloseLibrary( CxBase );
if ( IconBase ) CloseLibrary( IconBase );
/*
* --- bye bye
*/
exit( code );
}
/*
* --- Process the messages coming through the MsgPort
*/
void CheckML( void )
{
struct Message *msg;
struct IntuiMessage *imsg;
ULONG sig, type, id;
BOOL running = TRUE;
do {
sig = Wait( SIGBREAKF_CTRL_C | ML_smask );
if (( sig & SIGBREAKF_CTRL_C ) == SIGBREAKF_CTRL_C ) {
/*
* --- Break signal received. Shutting down...
*/
running = FALSE;
} else if (( sig & ML_smask) == ML_smask ) {
/*
* --- Got a message on the MsgPort. Examine it
*/
while (( msg = (struct Message *)GetMsg( ML_port ))) {
/*
* Get the message type and id
*/
id = CxMsgID((CxMsg *)msg);
type = CxMsgType((CxMsg *)msg);
ReplyMsg(msg);
switch( type ) {
case CXM_IEVENT:
switch( id ) {
case ML_QUIT:
running = FALSE;
break;
}
break;
case CXM_COMMAND:
/*
* --- They want us to do something...
*/
switch( id ) {
case CXCMD_UNIQUE:
/*
* --- They tried to run a commodity
* --- using our name.
*/
case CXCMD_KILL:
/*
* --- They want us dead....
*/
running = FALSE;
break;
case CXCMD_DISABLE:
/*
* --- They want us disabled...
*/
CxOff( ML_brok );
break;
case CXCMD_ENABLE:
/*
* --- They want us enabled...
*/
CxOn( ML_brok );
break;
}
break;
}
}
}
} while( running == TRUE );
/*
* --- The end, Fin, Einde, Finito....
*/
CxOff( ML_brok );
}
/*
* --- Simple main which set's things in motion
*/
void _main( void )
{
if ( NOT _WBMsg ) {
setmem( (void *)&ML_arg[0], 16L, 0L );
if (( ML_args = ReadArgs( ML_temp, &ML_arg[0], &ML_iargs ))) {
OpenML();
CheckML();
CloseML( 0L );
}
CloseML(27L);
} else {
if ( _WBMsg->sm_ArgList->wa_Lock )
CurrentDir( _WBMsg->sm_ArgList->wa_Lock );
OpenML();
CheckML();
CloseML( 0L );
}
atoi(""); /*** otherwise we get a link error and we don't want that ***/
_waitwbmsg();
}